package custos;

import java.math.BigDecimal;

import util.Real;

public class CalculadorDeCorretagemFator implements CalculadorDeCorretagem {
	private BigDecimal desconto;

	public CalculadorDeCorretagemFator(BigDecimal desconto) {
		this.desconto = desconto;
	}

	public Real calcular(Real valor) {
		Aliquota aliquota = Aliquota.getAliquota(valor);
		Real aux = valor.multiply(aliquota.getTaxa()).add(aliquota.getFixo())
				.multiply(desconto.subtract(new BigDecimal(1))).abs();
		return aux.multiply(iss).add(aux);
	}

	private static final class Aliquota {
		private Real fixo;

		private BigDecimal taxa;

		public static final Aliquota getAliquota(Real valor) {
			if (valor.doubleValue() < 135.06)
				return new Aliquota(new Real(2.70), new BigDecimal(0));
			else if (valor.doubleValue() < 498.62)
				return new Aliquota(new Real(0), new BigDecimal(2.0 / 100));
			else if (valor.doubleValue() < 1514.69)
				return new Aliquota(new Real(2.49), new BigDecimal(1.5 / 100));
			else if (valor.doubleValue() < 3026.38)
				return new Aliquota(new Real(10.06), new BigDecimal(1.0 / 100));
			else
				return new Aliquota(new Real(25.21), new BigDecimal(0.5 / 100));
		}

		public Real getFixo() {
			return fixo;
		}

		public void setFixo(Real fixo) {
			this.fixo = fixo;
		}

		public BigDecimal getTaxa() {
			return taxa;
		}

		public void setTaxa(BigDecimal taxa) {
			this.taxa = taxa;
		}

		public Aliquota(Real fixo, BigDecimal taxa) {
			this.fixo = fixo;
			this.taxa = taxa;
		}
	}

	public BigDecimal getDesconto() {
		return desconto;
	}

	public void setDesconto(BigDecimal desconto) {
		this.desconto = desconto;
	}
}